package com.ruoyi.servicesInfo.controller;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;

import com.ruoyi.bannerInfo.domain.BannerInfo;
import com.ruoyi.merchant.domain.Merchant;
import com.ruoyi.merchant.service.IMerchantService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.servicesInfo.domain.ServicesInfo;
import com.ruoyi.servicesInfo.service.IServicesInfoService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SecurityUtils;

/**
 * 服务功能Controller
 *
 * @author ruoyi
 * @date 2025-09-15
 */
@RestController
@RequestMapping("/ruoyi/servicesInfo")
public class ServicesInfoController extends BaseController
{
    @Autowired
    private IServicesInfoService servicesInfoService;

    @Autowired
    private IMerchantService merchantService;

    @Value("${miniapp.merchant-id:8}")
    private Long miniAppMerchantId;

    /**
     * 根据服务类型和启用状态查询服务列表
     * @param serviceType 服务类型：1=酒店服务 2=商城服务）
     * @param status 启用状态（0=启用 1=禁用）
     * @return 分页数据
     */
    @GetMapping("/listByTypeAndStatus")
    public TableDataInfo listByTypeAndStatus(String serviceType, String status) {

        // 获取当前用户所属商家ID
        Long userId = getUserId();
        // 获取商家信息
        Merchant merchantInfo = merchantService.selectMerchantByUserId(userId);
        Long merchantId = merchantInfo != null ? merchantInfo.getMerchantId() : null;

        // 非商家用户返回空数据
        if (merchantId == null) {
            return getDataTable(new ArrayList<>());
        }

        // 构造查询条件
        ServicesInfo servicesInfo = new ServicesInfo();
        servicesInfo.setMerchantId(merchantId);
        servicesInfo.setServiceType(serviceType);
        servicesInfo.setStatus(status);

        // 执行查询
        startPage();
        List<ServicesInfo> list = servicesInfoService.selectServicesInfoListByTypeAndStatus(servicesInfo);
        return getDataTable(list);
    }

    /**
     * 查询服务功能列表
     */
    @PreAuthorize("@ss.hasPermi('ruoyi:servicesInfo:list')")
    @GetMapping("/list")
    public TableDataInfo list(ServicesInfo servicesInfo)
    {
        // 判断是否为管理员
        Long userId = getUserId();
        if (!getLoginUser().getUser().isAdmin()) {
            // 非管理员用户需要设置商家ID
            Long merchantId = getMerchantIdForCurrentUser();

            // 非商家用户返回空数据
            if (merchantId == null) {
                return getDataTable(new ArrayList<>());
            }

            // 添加商家ID查询条件
            servicesInfo.setMerchantId(merchantId);
        }

        startPage();
        List<ServicesInfo> list = servicesInfoService.selectServicesInfoList(servicesInfo);
        return getDataTable(list);
    }

    /**
     * 导出服务功能列表
     */
    @PreAuthorize("@ss.hasPermi('ruoyi:servicesInfo:export')")
    @Log(title = "服务功能", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ServicesInfo servicesInfo)
    {
        // 判断是否为管理员
        Long userId = getUserId();
        if (!getLoginUser().getUser().isAdmin()) {
            // 非管理员用户需要设置商家ID
            Long merchantId = getMerchantIdForCurrentUser();

            // 非商家用户返回空数据
            if (merchantId == null) {
                // 导出空数据
                ExcelUtil<ServicesInfo> util = new ExcelUtil<ServicesInfo>(ServicesInfo.class);
                util.exportExcel(response, new ArrayList<>(), "服务功能数据");
                return;
            }

            // 添加商家ID查询条件
            servicesInfo.setMerchantId(merchantId);
        }

        List<ServicesInfo> list = servicesInfoService.selectServicesInfoList(servicesInfo);
        ExcelUtil<ServicesInfo> util = new ExcelUtil<ServicesInfo>(ServicesInfo.class);
        util.exportExcel(response, list, "服务功能数据");
    }

    /**
     * 获取服务功能详细信息
     */
    @PreAuthorize("@ss.hasPermi('ruoyi:servicesInfo:query')")
    @GetMapping(value = "/{serviceId}")
    public AjaxResult getInfo(@PathVariable("serviceId") Long serviceId)
    {
        ServicesInfo servicesInfo = servicesInfoService.selectServicesInfoByServiceId(serviceId);

        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 验证商家权限
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId != null && !merchantId.equals(servicesInfo.getMerchantId())) {
                return AjaxResult.error("无权访问该数据");
            }
        }

        return success(servicesInfo);
    }

    /**
     * 新增服务功能
     */
    @PreAuthorize("@ss.hasPermi('ruoyi:servicesInfo:add')")
    @Log(title = "服务功能", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody ServicesInfo servicesInfo)
    {
        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 自动设置商家ID
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId == null) {
                return AjaxResult.error("当前用户无权添加服务信息");
            }
            servicesInfo.setMerchantId(merchantId);
        }
        return toAjax(servicesInfoService.insertServicesInfo(servicesInfo));
    }

    /**
     * 修改服务功能
     */
    @PreAuthorize("@ss.hasPermi('ruoyi:servicesInfo:edit')")
    @Log(title = "服务功能", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody ServicesInfo servicesInfo)
    {
        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 验证商家权限
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId != null && !merchantId.equals(servicesInfo.getMerchantId())) {
                return AjaxResult.error("无权修改该数据");
            }
        }
        return toAjax(servicesInfoService.updateServicesInfo(servicesInfo));
    }

    /**
     * 删除服务功能
     */
    @PreAuthorize("@ss.hasPermi('ruoyi:servicesInfo:remove')")
    @Log(title = "服务功能", businessType = BusinessType.DELETE)
    @DeleteMapping("/{serviceIds}")
    public AjaxResult remove(@PathVariable Long[] serviceIds)
    {
        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 验证商家权限
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId == null) {
                return AjaxResult.error("当前用户无权删除服务信息");
            }

            // 检查要删除的数据是否属于当前商家
            for (Long serviceId : serviceIds) {
                ServicesInfo servicesInfo = servicesInfoService.selectServicesInfoByServiceId(serviceId);
                if (!merchantId.equals(servicesInfo.getMerchantId())) {
                    return AjaxResult.error("无权删除不属于当前商家的数据");
                }
            }
        }

        return toAjax(servicesInfoService.deleteServicesInfoByServiceIds(serviceIds));
    }

    /**
     * 小程序端获取服务列表（公开接口，不需要登录）
     * 根据服务类型和启用状态查询服务列表
     * @param serviceType 服务类型：1=酒店服务 2=商城服务）
     * @param status 启用状态（0=启用 1=禁用）
     * @return 服务列表
     */
    @GetMapping("/miniapp/listByTypeAndStatus")
    public AjaxResult miniappListByTypeAndStatus(String serviceType, String status) {
        // 小程序端使用固定的商家ID
        Long merchantId = getMiniAppMerchantId();

        if (merchantId == null) {
            return AjaxResult.error("未配置小程序商家ID");
        }

        // 构造查询条件
        ServicesInfo servicesInfo = new ServicesInfo();
        servicesInfo.setMerchantId(merchantId);
        servicesInfo.setServiceType(serviceType);
        servicesInfo.setStatus(status);

        // 执行查询
        List<ServicesInfo> list = servicesInfoService.selectServicesInfoListByTypeAndStatus(servicesInfo);
        return AjaxResult.success(list);
    }

    /**
     * 获取小程序端的商家ID
     * @return 商家ID
     */
    private Long getMiniAppMerchantId() {
        // 从配置文件中读取小程序商家ID
        return miniAppMerchantId;
    }

    /**
     * 获取当前用户所属商家ID
     * 管理端：返回当前登录管理员所属的商家ID
     * 小程序端：返回小程序绑定的商家ID
     * @return 商家ID
     */
    private Long getMerchantIdForCurrentUser() {
        // 获取当前用户ID
        Long userId = getUserId();

        // 管理员用户特殊处理
        if (SecurityUtils.isAdmin(userId)) {
            // 管理员可以看到所有数据，但在新增/修改时需要指定商家ID
            // 这里返回null，让调用方决定是否需要特殊处理
            return null;
        }

        // 普通用户：根据用户ID查询所属商家
        Merchant merchantInfo = merchantService.selectMerchantByUserId(userId);
        return merchantInfo != null ? merchantInfo.getMerchantId() : null;
    }
}
